﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CRC.Comun.Presentacion;
using CRC.GestionSalones.Controladores;
using System.IO;

namespace CRC.GestionSalones.Presentacion
{
    public partial class FotosDeSalon : UsrExploradorFotos
    {
        private ControladorGestionFotosSalon cGFS = new ControladorGestionFotosSalon();
        
        private UsrThumbnail miniaturaActual = null;

        public FotosDeSalon() : base()
        {
            base.cGC = cGFS;
            InitializeComponent();
            listarCategorias();
        }

        public int IDSalon {
            set 
            {
                try
                {
                    cGFS.obtenerSalon(value);
                }
                catch (Exception ex)
                {
                    //TODO add MesssageBox.show(...)
                }
            }
        }

        #region " Eventos "

            protected override void subirFoto(string pStrArchivo) 
            {
                btnSubirFoto.Enabled = false;
                listView1.Enabled = false;
                añadirMiniatura();

                int intCat = (int)listView1.SelectedItems[0].Tag;
                subirImagen.RunWorkerAsync(
                    new Object[] { pStrArchivo, intCat, txtComentario.Text.Trim() }
                );
                
            }

            private void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (listView1.SelectedItems.Count > 0) // Si cat=incidencias NO subir/eliminar
                {
                    if ((int)listView1.SelectedItems[0].Tag != 1)
                    {
                        btnSubirFoto.Enabled = true;
                        butElimCateg.Enabled = true;
                    }
                    listarFotosDeCategoria();
                }
                else 
                {
                    btnSubirFoto.Enabled = false;
                    butElimCateg.Enabled = false;
                }
            }

            protected void listarCategorias()
            {
                try
                {
                    IList<Object[]> cats = cGFS.listarCategorias();
                    foreach (Object[] cat in cats)
                    {
                        ListViewItem item = listView1.Items.Add((String)cat[1], 0);
                        item.Tag = (int)cat[0];
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            #region " Miniatura "

                void miniatura_evVerFoto(Object sender, int pIntId)
                {
                    miniaturaActual = (UsrThumbnail)sender;
                    miniaturaActual.cargandoImagen = true;
                    cargandoFoto.RunWorkerAsync( pIntId );
                }

                void miniatura_evSeleccionarFoto(Object sender, String pInformacion)
                {
                    UsrThumbnail mini = (UsrThumbnail)sender;
                    foreach (Control c in panelMiniaturas.Controls)
                    {
                        if (c != sender)
                            c.BackColor = Color.White;
                        else 
                        {
                            if (c.BackColor.Equals(Color.FromKnownColor(KnownColor.Control)))
                                c.BackColor = Color.White;
                            else 
                                c.BackColor = Color.FromKnownColor(KnownColor.Control);
                        }
                    }

                    lblSize.Text = "Tamaño: " + mini.TamañoEnKB + " KB";
                    txtComentario.Text = pInformacion;
                }

                void miniatura_evEliminarFoto(Object sender, int pIntId)
                {
                    try
                    {
                        cGFS.eliminarFoto(pIntId);
                        quitarMiniatura((UsrThumbnail)sender);
                    }
                    catch (Exception ex) 
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                
                #endregion

            #endregion

        #region " Operaciones "

            private void listarFotosDeCategoria() 
            {
                listView1.Enabled = false;
                panelMiniaturas.Controls.Clear();
                mostrarCargando(true);
                int intCat = (int)listView1.SelectedItems[0].Tag;
                listarFotos.RunWorkerAsync(intCat);
            }

            private void añadirMiniatura(
                int pIntId, 
                Image pFot, 
                String pStrNombre, 
                String pStrCom,
                int pIntTamEnKB) 
            { 
                UsrThumbnail miniatura = new UsrThumbnail(pIntId, pFot, pStrNombre, pStrCom, pIntTamEnKB);
                panelMiniaturas.Controls.Add(miniatura);
                miniatura.evEliminarFoto += new UsrThumbnail.eliminarFoto(miniatura_evEliminarFoto);
                miniatura.evSeleccionarFoto += new UsrThumbnail.seleccionarFoto(miniatura_evSeleccionarFoto);
                miniatura.evVerFoto += new UsrThumbnail.verFoto(miniatura_evVerFoto);
            }

            protected void añadirMiniatura()
            {
                UsrThumbnail miniatura = new UsrThumbnail();
                panelMiniaturas.Controls.Add(miniatura);
                miniatura.evEliminarFoto += new UsrThumbnail.eliminarFoto(miniatura_evEliminarFoto);
                miniatura.evSeleccionarFoto += new UsrThumbnail.seleccionarFoto(miniatura_evSeleccionarFoto);
                miniatura.evVerFoto += new UsrThumbnail.verFoto(miniatura_evVerFoto);
            }

            protected void quitarMiniatura(UsrThumbnail pMini)
            {
                this.panelMiniaturas.Controls.Remove(pMini);
                this.txtComentario.Text = String.Empty;
            }

        #endregion

        #region " Subir foto (BackroundWorker)"

            private void subirImagen_DoWork(object sender, DoWorkEventArgs e)
            {
                try
                {
                    Object[] parametros = (Object[])e.Argument;
                    e.Result = cGFS.nuevaFoto((String)parametros[0], (int)parametros[1], (String)parametros[2]);
                }
                catch (Exception ex)
                {
                    e.Cancel = true;
                    throw ex;
                }   
            }

            void subirImagen_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
            {

                btnSubirFoto.Enabled = true;
                listView1.Enabled = true;

                if (e.Error == null)
                {
                    Object[] res = (Object[])e.Result;

                    UsrThumbnail miniatura = (UsrThumbnail)panelMiniaturas.Controls[panelMiniaturas.Controls.Count - 1];
                    miniatura.PonerImagen((int)res[0], (Image)res[1], (String)res[2], (String)res[3], (int)res[4]);
                }
                else
                {
                    //Quitar miniatura
                    panelMiniaturas.Controls.Remove(panelMiniaturas.Controls[panelMiniaturas.Controls.Count - 1]);

                    try { throw e.Error; }
                    catch (FileNotFoundException fNFEx)
                    {
                        MessageBox.Show("No se pudo encontrar la imagen :\n" + fNFEx.FileName,
                            "Imagen no encontrada", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                    catch (IOException ioEx)
                    {
                       MessageBox.Show("Error con el archivo.\n" + ioEx.Message,
                            "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }   
                }
            }

           
        #endregion

        #region " Listar fotos (BackgroundWorker) "

            private void listarFotos_DoWork(object sender, DoWorkEventArgs e)
            {
                try
                {
                    int intCat = (int)e.Argument;
                    e.Result = cGFS.listarFotos(intCat);
                }
                catch (Exception ex)
                {
                    e.Cancel = true;
                    throw ex;
                }
            }

            void listarFotos_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
            {
                listView1.Enabled = true;

                if (e.Error == null)
                {
                    mostrarCargando(false);
                    IList<Object[]> infoFotos = (IList<Object[]>)e.Result;
                    foreach (Object[] infFot in infoFotos)
                        añadirMiniatura(
                            (int)infFot[0],
                            (Image)infFot[2],
                            (String)infFot[1],
                            (String)infFot[3],
                            (int)infFot[4]
                        );
                }
                else 
                {
                    try { throw e.Error; }
                    catch(Exception ex){
                        MessageBox.Show(ex.Message, "Error",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }

        #endregion

        #region " Cargando foto (BackgroundWorker) "

                private void cargandoFoto_DoWork(object sender, DoWorkEventArgs e)
                {
                    try 
                    {
                        e.Result = cGFS.verFoto((int)e.Argument);
                    }
                    catch (Exception ex)
                    {
                        e.Cancel = true;
                        throw ex;
                    }
                }

                void cargandoFoto_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
                {
                    miniaturaActual.cargandoImagen = false;
                    if (e.Error == null)
                    {
                        verFoto((Image)e.Result, miniaturaActual.NombreImagen, miniaturaActual.Comentarios);
                    }
                    else
                    {
                        try { throw e.Error; }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }

                private void verFoto(Image pFoto, String pStrNombre, String pStrCom) 
                {
                    VerFoto verFoto = new VerFoto(pFoto, pStrNombre, pStrCom);
                    verFoto.StartPosition = FormStartPosition.CenterScreen;
                    verFoto.ShowDialog();
                }

        #endregion
    }
}
